package com.clear.proxy.dynamicProxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;

public class CacheInvocationHandler implements InvocationHandler {

    private HashMap<String, String> cache = new LinkedHashMap<>(256);

    private DatabaseDataQuery databaseDataQuery;    // 组合被代理类

    public CacheInvocationHandler() {
        this.databaseDataQuery = new DatabaseDataQuery();
    }

    public CacheInvocationHandler(DatabaseDataQuery databaseDataQuery) {
        this.databaseDataQuery = databaseDataQuery;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 1、判断是哪一个方法
        String result = null;
        // todo 这里匹配想要被代理发方法，并做功能增强
        if ("query".equals(method.getName())) {
            // 2.查缓存，命中直接返回
            result = cache.get(args[0].toString());
            if (result != null) {
                System.out.println("命中！走缓存");
                return result;
            }
            // 3.未命中，查询数据库，将查询结果存入缓存，再次查询时走缓存
            System.out.println("未命中！");
            result = (String) method.invoke(databaseDataQuery, args);
            // 如果查到了，缓存
            cache.put(args[0].toString(),result);
            return result;
        }

        // 当其他的方法被调用，不希望被干预（不希望被代理），直接调用原生的方法
        return method.invoke(databaseDataQuery,args);
    }
}
